#pragma once
#include "Queue.hpp"

namespace yzrilyzr_collection{
	template<typename E>
	ECLASS(Deque, public Queue<E>){
	public:
	virtual void addFirst(const E &e)=0;
	virtual void addLast(const E &e)=0;
	virtual bool offerFirst(const E & e)=0;
	virtual bool offerLast(const E & e)=0;
	virtual E removeFirst()=0;
	virtual E removeLast()=0;
	virtual std::optional<E> pollFirst()noexcept =0;
	virtual std::optional<E> pollLast()noexcept =0;
	virtual E getFirst()const=0;
	virtual E getLast()const=0;
	virtual std::optional<E> peekFirst()const noexcept=0;
	virtual std::optional<E> peekLast()const noexcept=0;
	virtual bool removeFirstOccurrence(const E & o)=0;
	virtual bool removeLastOccurrence(const E & o)=0;
	virtual void push(const E & e)=0;
	virtual E pop()=0;
	virtual std::unique_ptr<Iterator<E>> descendingIterator()=0;
	};
}